// 博文 C++输入文件流遇空白符结束
#include <iostream>
#include <fstream>
#include <string.h>
int main(void)
{
  std::fstream fs;
  fs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\afile.dat", std::ios::trunc | std::ios::out);
  if (!fs)
  {
    std::cout << "open afile.dat err!" << std::endl;
    exit(-1);
  }
  char str[100];

  std::cout << "enter sentence 1 : ";
  std::cin >> str;
  fs << str;
  // fs << str << std::endl;

  std::cout << "enter sentence 2 : ";
  std::cin >> str;
  // fs << str << "\n";
  fs << str << "\t";
  // fs << str << "\v";
  // fs << str << "\f";
  // fs << str << "\r";
  // fs << str << " ";

  // fs << str << "\0";// 只有空白符才会
  // fs << str << std::endl;

  std::cout << "enter sentence 3 : ";
  std::cin >> str;
  fs << str;
  // fs << str << std::endl;

  // std::cout << "enter sentence 4 : ";
  // std::cin >> str;
  // fs << str;
  // fs << str << std::endl;

  // std::cout << "enter sentence 5 : ";
  // std::cin >> str;
  // fs << str;
  // fs << str << std::endl;
  fs.close();

  // 读取文件a,并复制到b
  std::ifstream ifs;
  ifs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\afile.dat");
  if (!ifs)
  {
    std::cout << "open afile.dat err!" << std::endl;
    exit(-1);
  }
  std::ofstream ofs;
  ofs.open("E:\\CodeField\\Code_Cpp\\C_Single\\csdn\\20211010\\src\\bfile.dat", std::ios::trunc);
  if (!ofs)
  {
    std::cout << "open bfile.dat err!" << std::endl;
    exit(-1);
  }

  // 由于 eof 指示是在读取文件到结尾的时候，才会改变有效的状态。但是，再下一次没有读到数据的时候，eof 才会改变；

  // 但是如果此时还是用 eof 标志位来判断文件是否读到了 end（下图while循环），就会导致此时的 infile>>data 语句还会流入数据（文件的最后一行数据），导致复制的文件中，会多出一行。

  // 关于一楼的文件复制粘贴，在使用 cin.eof() 方法时由于被复制文件最后有空行，最后一个字符或字符串会被复制两次。

  // 更好的解决方法：使用流对象作为条件来做，while (infile>>data) 可完美复制粘贴。

  // while (!ifs.eof())
  // cin.unsetf(std::ios::skipws);//取消默认的忽视空白字符
  ifs.unsetf(std::ios::skipws); // 设置后循环要改下，空白符条件为假
  int i = 0;
  // while (ifs >> str) // 不跳空白符，会有假的可能
  char ch = '\0';
  while (1)
  {
    ch = ifs.get(); // 该函数会改变文件指针
    // ifs.seekg(-1, std::ios::cur);
    if (ch == EOF)
    {
      std::cout << "read file is over!" << std::endl;
      break;
    }
    // else if (ch == '\t')
    // {
    //   std::cout << "it is v tab!!" << std::endl;
    // }
    else if (ch == '\n' || ch == '\t' || ch == '\v' || ch == '\f' || ch == 'r' || ch == ' ')
    {
      // char -> char * ????
      // 有中文的话，复制还是有问题
      char t[2];
      t[0] = ch;
      t[1] = '\0';
      strcpy(str, t);

      std::cout << "it is a white-space character !!!" << std::endl;

      std::cout << "chunk" << ++i << " : " << str << std::endl;
      ofs << str;

      
      // ifs.seekg(-1, std::ios::cur); // 空白字符回位
      // ifs >> str;
    }
    else
    {
      ifs.seekg(-1, std::ios::cur); // 普通字符回位
      std::cout << "ch : " << ch << std::endl;
      ifs >> str;
      std::cout << "chunk" << ++i << " : " << str << std::endl;
      ofs << str;
    }
    // ifs >> str;
    // if (strcmp(str, "") == 0)
    // {
    //   std::cout << "xx" << std::endl;
    //   // ifs.seekg(4 + 8 + 1, std::ios::beg);
    //   ifs.seekg(2, std::ios::beg);
    // }
    // if (i != 0)
    // {
    //   std::cout << "str len : " << strlen(str) << std::endl;
    // }
    // std::cin.get(ch);

    // ifs.get(ch); // 从文件输入流中读取一个字符成功
    // if (ch == EOF)
    // {
    //   std::cout << "read file is over!" << std::endl;
    //   break;
    // }
    // else if (ch == '\t')
    // {
    //   std::cout << "it is v tab!!" << std::endl;
    // }
    // else
    // {
    //   std::cout << "ch : " << ch << std::endl;
    // }

    // std::cout << "chunk" << ++i << " : " << str << std::endl;
    // ofs << str;

    // 操作处理完判断
    // ch == '\n'
    // if (ifs.eof())
    // {
    //   std::cout << "read file is over!" << std::endl;
    //   break;
    // }
  }

  ifs.close();
  ofs.close();

  printf("--------------end--------------\n");
  return 0;
}
